Глава 6
ЭЛЕМЕНТЫ ЯЗЫКА
6.1. АЛФАВИТ
Алфавит языка Object Pascal включает буквы, цифры, шестнадцатеричные цифры, специальные символы, пробелы и зарезервированные слова.
Буквы - это буквы латинского алфавита от а до z и от А до Z, а также знак подчеркивания “_”. В языке нет различия между заглавными и строчными буквами алфавита, если только они не входят в символьные и строковые выражения.
Цифры - арабские цифры от 0 до 9.
Каждая шестнадцатеричная цифра имеет значение от 0 до 15. Первые 10 значений обозначаются арабскими цифрами 0... 9, остальные шесть - латинскими буквами а ... f или а... f.
Специальные символы Object Pascal - это символы
+ - * / = , ' . : ; < > [ ] ( ) { } " @ $ #
К специальным символам относятся также следующие пары символов:
< > , < = , > = , : = , ( * , * ) , ( . , . ) , / / .
В программе эти пары символов нельзя разделять пробелами, если они используются как знаки операций отношения или ограничители комментария. Символы (. и .) могут употребляться соответственно вместо [ и ].
Особое место в алфавите языка занимают пробелы, к которым относятся любые символы в диапазоне кодов от 0 до 32. Эти символы рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов. Несколько следующих друг за другом пробелов считаются одним пробелом (последнее не относится к строковым константам).
В Object Pascal имеются следующие зарезервированные слова:
and | exports | mod | Shr | |||
array | file | nil | String | |||
as | finalization | not | then |
asm |
finally |
object |
threadvar |
begin |
for |
of |
to |
|||
case |
function |
or |
try |
|||
class |
goto |
out |
type |
|||
const |
if |
packed |
unit |
|||
constructor |
implementation |
procedure |
until |
|||
destructor |
in |
program |
uses |
|||
dispinterface |
inherited |
property |
var |
|||
div |
initialization |
raise |
while |
|||
do |
inline |
record |
with |
|||
downto |
interface |
repeat |
xor |
|||
else |
is |
resourcestring |
|
|||
end |
label |
set |
|
|||
except |
library |
shi |
|
Зарезервированные слова не могут использоваться в качестве идентификаторов.
Стандартные директивы первоначально связаны с некоторыми стандартными объявлениями в программе. К ним относятся:
absolute |
dynamic |
name |
public |
safecall |
abstract |
export |
near |
published |
stdcall |
assembler |
external |
nodefault |
read |
stored |
automated |
far |
override |
readonly |
virtual |
cdecl |
forward |
package |
register |
write |
contains |
implements |
pascal |
re introduce |
writeonly |
default |
index |
private |
requires |
|
dispid |
message |
protected |
resident |
|
Как и зарезервированные слова, стандартные директивы в окне кода Delphi выделяются жирным шрифтом, тем не менее вы можете переопределить любую стандартную директиву, т. е. объявить одноименный идентификатор.
Слова private, protected, public, published И automated считаются зарезервированными внутри объявления класса и стандартными директивами - вне объявления.
6.2. ИДЕНТИФИКАТОРЫ
Идентификаторы в Object Pascal - это имена констант, переменных, меток, типов, объектов, классов, свойств, процедур, функций, модулей, программ и полей в записях. Идентификаторы могут иметь произвольную длину.
Идентификатор всегда начинается буквой, за которой могут следовать буквы и цифры. Напомню, что буквой считается также символ подчеркивания, поэтому идентификатор может начинаться этим символом и даже состоять только из одного или нескольких символов подчеркивания. Пробелы и специальные символы алфавита не могут входить в идентификатор.
Примеры правильных идентификаторов:
a |
MyProgramIsBestProgram |
external |
ALPHA |
date_27_sep_39 |
_beta |
Примеры неправильных идентификаторов:
1 Program // начинается цифрой
block#l // содержит специальный символ
My Prog // содержит пробел
mod // зарезервированное слово
6.3. КОНСТАНТЫ
В качестве констант в Object Pascal могут использоваться целые, вещественные и шестнадцатеричные числа, логические константы, символы, строки символов, конструкторы множеств и признак непределенного указателя NIL.
Целые числа записываются со знаком или без него по обычным правилам и могут иметь значение в диапазоне от -263 до +263-11. Следует учесть, что, если целочисленная константа выходит за указанные границы, компилятор дает сообщение об ошибке. Такие константы должны записываться с десятичной точкой, т. е. определяться как вещественные числа.
Вещественные числа записываются со знаком или без него с использованием десятичной точки и/или экспоненциальной части.
Экспоненциальная часть начинается символом е или е, за которым могут следовать знаки “+” или “-” и десятичный порядок. Символ е (е) означает десятичный порядок и имеет смысл “умножить на 10 в степени”. Например,
3.14Е5 - 3,14 умножить на 10 в степени 5;
-17e-2 -минус 17 умножить на 10 в степени минус 2.
Если в записи вещественного числа присутствует десятичная точка, перед точкой и за ней должно быть хотя бы по одной цифре. Если используется символ экспоненциальной части е (в), за ним должна следовать хотя бы одна цифра десятичного порядка.[Только для версий 4...6. Для версии 1 диапазон от -32536 до +32535. Для версии 2 и 3 от -2147483648 до +4294967294]
Шестнадцатеричное число состоит из шестнадцатеричных цифр, которым предшествует знак доллара $ (код символа 36). Диапазон шестнадцатеричных чисел - от $ffffffffffffffff до
$7FFFFFFFFFFFFFFF (для версии 4...6).
Логическая константа - это либо слово false (ложь), либо слово true (истина).
Символьная константа - это любой символ ПК, заключенный в апострофы:
'z' - символ “z”;
'Ф' - символ “Ф”.
Если необходимо записать собственно символ апострофа, он удваивается:
'''' - символ “'” (апостроф).
Допускается использование записи символа путем указания его внутреннего кода, которому предшествует символ # (код 35), например:
#97 - символ “а”;
#90 - символ “Z”;
#39 - символ “'”;
#13 - символ “CR”.
Строковая константа - любая последовательность символов (кроме символа CR - возврат каретки), заключенная в апострофы. Если в строке нужно указать сам символ апострофа, он удваивается, например:
'Это - строка символов';
'That''s string'.
Строка символов может быть пустой, т. е. не иметь никаких символов в обрамляющих ее апострофах. Строку можно составлять из кодов нужных символов с предшествующими каждому коду символами #, например, строка #83#i2i#i09#98#ii#i08 эквивалентна строке ' Symbol '.
Наконец, в строке можно чередовать части, записанные в обрамляющих апострофах, с частями, записанными кодами. Таким способом можно вставлять в строки любые управляющие символы, в том числе и символ cr (код 13), например:
#7'Ошибка !'#13'Нажмите любую клавишу ...'#7 .
Конструктор множества - список элементов множества, обрамленный-квадратными скобками,например:
[1,2,4..7,12]
[blue, red]
[ ]
[true]
В Object Pascal разрешается в объявлении констант использовать произвольные выражения, операндами которых могут быть ранее объявленные нетипизированные константы, имена типов и объектов, а также следующие функции от них:
abs |
lo |
ptr |
swap |
chr |
odd |
round |
trunc |
hi |
ord |
sizeof |
|
length |
pred |
succ |
Например:
const
MaxReal = Maxint div SizeOf(real) ;
NumChars = ord('Z') - ord('a') + 1;
Ln10 = 2.302585092994;
Ln10R = 1 / Ln10;
6.4. ВЫРАЖЕНИЯ
Основными элементами, из которых конструируется исполняемая часть программы, являются константы, переменные и обращения к функциям. Каждый из этих элементов характеризуется своим значением и принадлежит к какому-либо типу данных. С помощью знаков операций и скобок из них можно составлять выражения, которые фактически представляют собой правила получения новых значений.
Частным случаем выражения может быть просто одиночный элемент, т. е. константа, переменная или обращение к функции. Значение такого выражения имеет, естественно, тот же тип, что и сам элемент. В более общем случае выражение состоит из нескольких элементов (операндов) и знаков операций, а тип его значения определяется типом операндов и видом примененных к ним операций.
Примеры выражений:
у
21 (а + b) * с
sin(t)
а > 2
not Flag and (a = b)
NIL
[1, 3..7] * setl
6.5. ОПЕРАЦИИ
В Object Pascal определены следующие операции:
унарные not, @ ;
мультипликативные *, /, div, mod, and, shi, shr;
аддитивные +, -, or, xor;
отношения =, <>, <, >, <=, >=, in.
Приоритет операций убывает в указанном порядке, т. е. наивысшим приоритетом обладают унарные операции, низшим - операции отношения. Порядок выполнения нескольких операций равного приоритета устанавливается компилятором из условия оптимизации кода программы и не обязательно слева направо. При исчислении логических выражений операции равного приоритета всегда вычисляются слева направо, причем будут вычисляться все или только достаточные операции в зависимости от установленного в среде
Delphi переключателя Project | Options | Compiler | Complete
Boolean eval: при установленном переключателе вычисляются все операции отношения, при неустановленном - только те, что необходимы для однозначного определения результата исчисления.
Правила использования операций с операндами различного типа приводятся в табл. 6.1.
Таблица 6.1
Операция |
Действие |
Тип операндов |
Тип результата |
not |
Отрицание |
Логический |
Логический |
not |
To же |
Любой целый |
Тип операнда |
@ |
Адрес |
Любой |
Указатель |
* |
Умножение |
Любой целый |
Наименьший целый |
* |
Тоже |
Любой вещественный |
Extended |
* |
Пересечение множеств |
Множественный |
Множественный |
/ |
Деление |
Любой вещественный |
Extended |
div |
Целочисленное деление |
Любой целый |
Наименьший целый |
mod |
Остаток от деления |
Тоже |
- Тоже |
and |
Логическое И |
Логический |
Логический |
and |
То же |
Любой целый |
Наименьший целый |
shl |
Левый сдвиг |
Тоже |
То же |
shr |
Правый сдвиг |
То же |
То же |
+ |
Сложение |
Тоже |
Тоже |
+ |
Тоже |
Любой вещественный |
Extended |
+ |
Объединение множеств |
Множественный |
Множественный |
+ |
Сцепление строк |
Строковый |
Строковый |
- |
Вычитание |
Любой целый |
Наименьший целый |
- |
Тоже |
Любой вещественный |
Extenden |
or |
Логическое или |
Логический |
Логический |
or |
Тоже |
Любой целый |
Наименьший целый |
= |
Равно |
Любой простой или строковый |
Логический |
0 |
Не равно |
Тоже |
Тоже |
< |
Меньше |
Логический |
Логический |
<= |
Меньше или равно |
Тоже |
Тоже |
> |
Больше |
То же |
Тоже |
>= |
Больше или равно |
Тоже |
Тоже |
Унарная операция @ применяется к операнду любого типа и возвращает результат типа pointer (см. гл. 9), в котором содержится адрес операнда. Если операция @ применяется к процедуре, функции или методу в объекте, ее результатом будет адрес точки входа в эту процедуру (функцию, метод). Этот адрес можно использовать только в подпрограмме, написанной на Ассемблере, или во фрагментах
INLINE.
В Object Pascal определены следующие логические операции:
not - логическое НЕ;
and - логическое И;
or - логическое ИЛИ;
xor - исключительное ИЛИ.
Логические операции применимы к операндам целого и логического типов. Если операнды - целые числа, то результат логической операции есть тоже целое число, биты которого (двоичные разряды) формируются из битов операндов по правилам, указанным в табл. 6.2.
Таблица 6.2
Логичеcкие операции над данными целого типа (поразрядно) 5 |
|||||
Операнд 1 |
Операнд 2 |
not |
and |
or |
xor |
1 |
- |
0 |
- |
- |
- |
0 |
- |
1 |
- |
- |
- |
0 |
0 |
- |
0 |
0 |
0 |
0 |
1 |
- |
0 |
1 |
1 |
1 |
0 |
- |
0 |
1 |
1 |
1 |
1 |
- |
1 |
1 |
0 |
К логическим же в Object Pascal обычно относятся и две сдвиговые операции над целыми числами:
i shl j - сдвиг содержимого / на j разрядов влево; освободившиеся младшие разряды заполняются нулями;
i shr j - сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями.
В этих операциях i и у - выражения любого целого типа.
Логические операции над логическими данными дают результат логического типа по правилам, указанным в табл. 6.3.
Таблица 6.3
Логические операции над данными логического типа |
|||||
Операнд 1 |
Операнд 2 |
not |
and |
or |
xor |
True |
- |
False |
- |
- |
- |
False |
- |
True |
- |
- |
- |
False |
False |
- |
False |
False |
False |
False |
True |
- |
False |
True |
True |
True |
False |
- |
False |
True |
True |
True |
True |
- |
True |
True |
False |
Операция отношения in применяется к двум операндам. Первым (левым) операндом должно быть выражение любого порядкового типа, вторым - множество, состоящее из элементов того же типа, или идентификатор множественного типа. Результат операции будет True, если левый операнд принадлежит множеству.